Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / NomadRichHtmlLinks.js

Displaying Raw • Download


meshchatx/src/frontend/js/NomadRichHtmlLinks.js a81a7dc30ebffa59cd31abcca7b0e81db4a5b891 (a81a7dc3) Text, 3.97 KB

Tff7b72import Te6edf3LinkUtils Tff7b72from Ta5d6ff"./LinkUtils.js"Tb4b4b4;

Tff7b72const Te6edf3HEX32 Tff7b72= Ta5d6ff/^[a-fA-F0-9]{32}$/Tb4b4b4;

Tff7b72export Tff7b72function Te6edf3openExternalHttpUrlTb4b4b4(Te6edf3urlTb4b4b4, Te6edf3opener Tff7b72= Tffa657windowTb4b4b4.Te6edf3openTb4b4b4.Te6edf3bindTb4b4b4(Tffa657windowTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3urlTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3openerTb4b4b4(Te6edf3urlTb4b4b4, Ta5d6ff"_blank"Tb4b4b4, Ta5d6ff"noopener,noreferrer"Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3stopEventTb4b4b4(Te6edf3eventTb4b4b4) Tb4b4b4{
Te6edf3eventTb4b4b4.Te6edf3preventDefaultTff7b72?Tb4b4b4.Tb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3eventTb4b4b4.Te6edf3stopPropagationTff7b72?Tb4b4b4.Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3scrollToElementIdTb4b4b4(Te6edf3idTb4b4b4, Te6edf3scrollRootTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3escapedId Tff7b72=
Tff7b72typeof Te6edf3CSS Tff7b72!== Ta5d6ff"undefined" Tff7b72&& Tff7b72typeof Te6edf3CSSTb4b4b4.Te6edf3escape Tff7b72=== Ta5d6ff"function" Tff7b72? Te6edf3CSSTb4b4b4.Te6edf3escapeTb4b4b4(Te6edf3idTb4b4b4) Tff7b72: Te6edf3idTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff/"/gTb4b4b4, Ta5d6ff'\\"'Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3el Tff7b72= Te6edf3scrollRoot Tff7b72? Te6edf3scrollRootTb4b4b4.Te6edf3querySelectorTb4b4b4(Ta5d6ff`Ta5d6ff#Tffd700${Te6edf3escapedIdTffd700}Ta5d6ff`Tb4b4b4) Tff7b72: Tffa657documentTb4b4b4.Te6edf3getElementByIdTb4b4b4(Te6edf3idTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3elTb4b4b4) Tb4b4b4{
Te6edf3elTb4b4b4.Te6edf3scrollIntoViewTb4b4b4(Tb4b4b4{ Te6edf3behaviorTff7b72: Ta5d6ff"smooth"Tb4b4b4, Te6edf3blockTff7b72: Ta5d6ff"nearest" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Intercepts clicks inside rich HTML (v-html) containers so nomad/mesh links stay
* in-app, http(s) links open externally, and other navigation does not trap the shell.
*
* @param {MouseEvent} event
* @param {object} [options]
* @param {Element|null} [options.scrollRoot] - scope fragment anchor scrolling
* @param {(url: string) => void} [options.onNomadUrl] - data-nomadnet-url handler
* @param {(address: string) => void} [options.onLxmfAddress] - data-lxmf-address handler
* @param {(destination: string, fields: string|null) => void} [options.onOpenNode]
* @param {(url: string) => void|Promise<void>} [options.openExternalHttp]
* @param {boolean} [options.blockUnhandledAnchors=true]
* @returns {boolean} true when the click was handled
*/
Tff7b72export Tff7b72function Te6edf3handleRichHtmlLinkClickTb4b4b4(Te6edf3eventTb4b4b4, Te6edf3options Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72const Tb4b4b4{
Te6edf3scrollRoot Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3onNomadUrlTb4b4b4,
Te6edf3onLxmfAddressTb4b4b4,
Te6edf3onOpenNodeTb4b4b4,
Te6edf3openExternalHttp Tff7b72= Te6edf3openExternalHttpUrlTb4b4b4,
Te6edf3blockUnhandledAnchors Tff7b72= Tff7b72trueTb4b4b4,
Tb4b4b4} Tff7b72= Te6edf3optionsTb4b4b4;

Tff7b72const Te6edf3nomadLink Tff7b72= Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3closestTb4b4b4(Ta5d6ff"a.nomadnet-link[data-nomadnet-url]"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3nomadLink Tff7b72&& Te6edf3onNomadUrlTb4b4b4) Tb4b4b4{
Te6edf3stopEventTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3url Tff7b72= Te6edf3nomadLinkTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"data-nomadnet-url"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4{
Te6edf3onNomadUrlTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

Tff7b72const Te6edf3lxmfLink Tff7b72= Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3closestTb4b4b4(Ta5d6ff"a.lxmf-link[data-lxmf-address]"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3lxmfLink Tff7b72&& Te6edf3onLxmfAddressTb4b4b4) Tb4b4b4{
Te6edf3stopEventTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3address Tff7b72= Te6edf3lxmfLinkTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"data-lxmf-address"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3address Tff7b72&& Te6edf3HEX32Tb4b4b4.Te6edf3testTb4b4b4(Te6edf3addressTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3onLxmfAddressTb4b4b4(Te6edf3addressTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

Tff7b72const Te6edf3externalAnchor Tff7b72= Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3closestTb4b4b4(Ta5d6ff"a[href]"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3externalAnchor Tff7b72&& Tff7b72!Te6edf3externalAnchorTb4b4b4.Te6edf3classListTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"nomadnet-link"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3href Tff7b72= Te6edf3externalAnchorTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"href"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3httpHref Tff7b72= Te6edf3href Tff7b72? Te6edf3LinkUtilsTb4b4b4.Te6edf3httpUrlHrefOrNullTb4b4b4(Te6edf3hrefTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72: Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3httpHrefTb4b4b4) Tb4b4b4{
Te6edf3stopEventTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4;
Te6edf3openExternalHttpTb4b4b4(Te6edf3httpHrefTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72const Te6edf3fragAnchor Tff7b72= Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3closestTb4b4b4(Ta5d6ff"a[href]"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(
Te6edf3fragAnchor Tff7b72&&
Te6edf3fragAnchorTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"href"Tb4b4b4) Tff7b72&&
Te6edf3fragAnchorTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"href"Tb4b4b4) Tff7b72!== Ta5d6ff"#" Tff7b72&&
Te6edf3fragAnchorTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"href"Tb4b4b4)Tb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"#"Tb4b4b4) Tff7b72&&
Tff7b72!Te6edf3fragAnchorTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"data-nomadnet-url"Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3stopEventTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3raw Tff7b72= Te6edf3fragAnchorTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"href"Tb4b4b4)Tb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3scrollToElementIdTb4b4b4(Tffa657decodeURIComponentTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4, Te6edf3scrollRootTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

Tff7b72const Te6edf3nodeLink Tff7b72= Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3closestTb4b4b4(Ta5d6ff'[data-action="openNode"]'Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3nodeLink Tff7b72&& Te6edf3onOpenNodeTb4b4b4) Tb4b4b4{
Te6edf3stopEventTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3destination Tff7b72= Te6edf3nodeLinkTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"data-destination"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3destinationTb4b4b4) Tb4b4b4{
Te6edf3onOpenNodeTb4b4b4(Te6edf3destinationTb4b4b4, Te6edf3nodeLinkTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"data-fields"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3blockUnhandledAnchorsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3anchor Tff7b72= Te6edf3eventTb4b4b4.Te6edf3targetTb4b4b4.Te6edf3closestTb4b4b4(Ta5d6ff"a[href]"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3anchorTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3href Tff7b72= Tb4b4b4(Te6edf3anchorTb4b4b4.Te6edf3getAttributeTb4b4b4(Ta5d6ff"href"Tb4b4b4) Tff7b72|| Ta5d6ff""Tb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3href Tff7b72&& Te6edf3href Tff7b72!== Ta5d6ff"#" Tff7b72&& Tff7b72!Te6edf3hrefTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"#"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3stopEventTb4b4b4(Te6edf3eventTb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────